package ru.rchervot.sanasar.server;

import java.util.ArrayList;
import java.util.Date;
import java.util.Random;

import ru.rchervot.sanasar.client.model.DefaultResultsPage;
import ru.rchervot.sanasar.client.model.DomainConstants;
import ru.rchervot.sanasar.client.model.ItemObjectCandidate;
import ru.rchervot.sanasar.client.model.Query;
import ru.rchervot.sanasar.client.model.ResultsPage;
import ru.rchervot.sanasar.client.model.SearchResultsItemCandidates;



public class SearchServiceServerCandidate extends SearchServiceServerAbstract {

	public ResultsPage<SearchResultsItemCandidates> executeQuery(Query q) throws Exception {
		if (q == null) return null;
		
		System.out.println(q.toString());
		System.out.println("sq: " + ServerQueryCandidate.build(q).getSQLCommand());
		
		Integer queryID = saveQueryToDB(q);
		q.setID(queryID);

		cacheQueries.put(queryID, q);
		
		return getPage(queryID);
	}
	
	public SearchResultsItemCandidates loadItem(int itemID, int userId) {
		return generateSRICandMock(itemID);
	}
	
//	public SearchResultsItemCandidates loadItem(int itemID, int userId) throws Exception {
//		SearchResultsItemCandidates result = new ServerFactory().buildSearchResultsItemCandidate();
//		
//		Context initCtx = new InitialContext();
//		Context envCtx = (Context) initCtx.lookup("java:comp/env");
//		DataSource ds = (DataSource)
//		envCtx.lookup("jdbc/mainDB");
//
//		Connection conn = ds.getConnection();
//		try {
//			Statement stmt = conn.createStatement();
//			try {
//				ResultSet rs = stmt.executeQuery("SELECT candidates.id, candidates.cand_name," +
//						" candidates.empl_title, candidates.empl_company, candidates.birth_year," +
//						" candidates.birth_month, candidates.birth_day, candidates.compensation_view," +
//						" candidates.region_name, candidates.created, candidates.updated," +
//						" candidates.creator_name, candidates.updater_name," +
//						" candidates.categories, candidates.languages," +
//						" candidates.email, candidates.phones," +
//						" candidates_view.contact_position_title, candidates_view.contact_company," +
//						" candidates_view.contact_note, candidates_view.contact_date," +
//						" candidates_view.contact_type, candidates_view.contact_result," +
//						" candidates_view.contact_creator_name," +
//						" cand_viewed.view_timestamp" + 
//					  " FROM candidates" +
//					  " JOIN candidates_view ON candidates.id = candidates_view.cand_id" +
//					  " LEFT OUTER JOIN cand_viewed ON candidates.id = cand_viewed.cand_id AND cand_viewed.user_id = " + userId + 
//					  " WHERE candidates.id = " + itemID);
//				try {
//					if (rs.next()) {
//						result.setItemID(rs.getInt("id"));
//						result.setCandName(rs.getString("cand_name"));
//						result.setCompensationView(rs.getString("compensation_view"));
//						result.setRegionName(rs.getString("region_name"));
//						result.setBirthDay(rs.getInt("birth_day"));
//						result.setBirthMonth(rs.getInt("birth_month"));
//						result.setBirthYear(rs.getInt("birth_year"));
//						result.setEmplTitle(rs.getString("empl_title"));
//						result.setEmplCompany(rs.getString("empl_company"));
//						
//						result.setContactPositionTitle(rs.getString("contact_position_title"));
//						result.setContactCompany(rs.getString("contact_company"));
//						result.setContactNote(rs.getString("contact_note"));
//						result.setContactDate(rs.getDate("contact_date"));
//						result.setContactType(rs.getString("contact_type"));
//						result.setContactResult(rs.getString("contact_result"));
//						result.setContactCreatorName(rs.getString("contact_creator_name"));
//						
//						result.setViewed(rs.getTimestamp("view_timestamp"));
//						result.setCreated(rs.getTimestamp("created"));
//						result.setUpdated(rs.getTimestamp("updated"));
//						result.setCreatorName(rs.getString("creator_name"));
//						result.setUpdaterName(rs.getString("updater_name"));
//						result.setCategories(rs.getString("categories"));
//						result.setLanguages(rs.getString("languages"));
//						
//						result.setContactsEmail(rs.getString("email"));
//						result.setContactsPhones(rs.getString("phones"));
//						
//					}
//				} finally {
//					cleanUp(rs);
//				}
//			} finally {
//				cleanUp(stmt);
//			}
//		} finally {
//			cleanUp(conn);
//		}
//		
//		return result;
//	}
	
	public ArrayList<SearchResultsItemCandidates> loadItems(ArrayList<Integer> itemsIDs, Integer userId) throws Exception {
		ArrayList<SearchResultsItemCandidates> result = new ArrayList<SearchResultsItemCandidates>(itemsIDs.size());
		
		for (int i = 0; i < itemsIDs.size(); i++) {
			result.add(i, loadItem(itemsIDs.get(i), userId));
		}
		
		return result;
	}
	
	public ResultsPage<SearchResultsItemCandidates> getPage(int queryID) throws Exception {
		return getPage(getQuery(queryID));
	}
	
	public ResultsPage<SearchResultsItemCandidates> getPage(int queryID, int offset, int pageSize) throws Exception {
		Query q = getQuery(queryID);
		q.setOffset(offset);
		q.setPageSize(pageSize);
		
		return getPage(q);
	}
	
	public ResultsPage<SearchResultsItemCandidates> getPage(Query q) throws Exception {
		ArrayList<Integer> qr = getQueryResult(q.getID());
				
		ResultsPage<SearchResultsItemCandidates> page = DefaultResultsPage.build(
				q.getOffset(), q.getPageSize(), qr.size(), q.getID());
		
		ArrayList<Integer> pr = new ArrayList<Integer>(qr.subList(
				page.getPageCurrentOffset(), 
				page.getPageCurrentOffsetEnd() + 1));

						
		page.setItems(loadItems(pr, q.getUserId()));
		
		return page;
		
	}
	
	public Query loadQuery(int queryID) {
		return getQuery(queryID);
	}
	
	public ItemObjectCandidate loadItemObject(int queryID, int offset) throws Exception {
		ItemObjectCandidate result = new ItemObjectCandidate();
		
		Integer itemID = getQueryResult(queryID).get(offset);
		
		result.setID(itemID);
		
		return result;
	}
	
	public ResultsPage<SearchResultsItemCandidates> firstPage(int queryID) throws Exception {
		Query q = getQuery(queryID);
		q.setOffset(0);
		
		return getPage(q);
	}

	public ResultsPage<SearchResultsItemCandidates> lastPage(int queryID) throws Exception {
		Query q = getQuery(queryID);
		ArrayList<Integer> r = getQueryResult(q.getID());
		
		q.setOffset(lastPageOffset(r.size(), q.getPageSize()));
		
		return getPage(q);
	}

	public static int lastPageOffset(int resultsSize, int pageSize) {
    	if (resultsSize <= 0) return 0;
    	
    	if (resultsSize <= pageSize) return 0;
    	
    	if ((resultsSize % pageSize) == 0) return ((resultsSize / pageSize) - 1) * pageSize; 
    	
    	return (resultsSize / pageSize) * pageSize;
	}
	
//	public ResultsPage<SearchResultsItemCandidates> nextPage(int queryID) throws Exception {
//		Query q = getQuery(queryID);
//		q.setOffset(q.getPageOffset() + q.getPageSize());
//		
//		return getPage(q);
//	}
//
//	public ResultsPage<SearchResultsItemCandidates> prevPage(int queryID) throws Exception {
//		Query q = getQuery(queryID);
//		q.setOffset(q.getPageOffset() - q.getPageSize());
//		
//		return getPage(q);
//	}
	
	private SearchResultsItemCandidates generateSRICandMock(int itemID) {
		SearchResultsItemCandidates ri = new ServerFactory()
		.buildSearchResultsItemCandidate();
		
		ri.setCandName("Petrov Ivan Sergeevich " + new Random().nextInt(10));
		ri.setBirthYear(1979);
		ri.setBirthMonth(9);
		ri.setBirthDay(9);
		
		ri.setCategories("Categories");
		ri.setClient(true);
		ri.setClientLastOrder(new Date(106, 0, 1));
		ri.setCompensation(1000);
		ri.setCompensationCurrency("USD");
		ri.setCompensationPeriod(DomainConstants.COMPENSATION_PERIOD_MONTH);
		ri.setCompensationType(DomainConstants.COMPENSATION_TYPE_NET);
		ri.setContactBranchId(null);
		ri.setContactComp("1000-2000");
		ri.setContactCompany("Coca-Cola iugih iulughiuyg iuhiuhui gigyuiugiu huhhu ");
		ri.setContactCreatorId(1);
		ri.setContactCreatorName("ContCreatorName");
		ri.setContactDate(new Date(105, 3, 6));
		ri.setContactDatetime(new Date(107, 3, 6));
		ri.setContactId(100);
		ri.setContactNote("contactNote");
		ri.setContactOrder("contactOrder");
		ri.setContactOrderId(new Random().nextInt(3));
		ri.setContactPerson(true);
		ri.setContactPositionId(null);
		ri.setContactPositionTitle("Sales Manager giuguih hiu hiuhi ug iuygoiugh");
		ri.setContactResult("contactResult");
		ri.setContactResultId(null);
		ri.setContactsEmail("eee@ccc.ru");
		ri.setContactsPhones("909 1234567");
		ri.setContactType("contactType");
		ri.setCreated(new Date(106, 0, 1));
		ri.setCreatorId(1);
		ri.setCurrencyRate(0);
		ri.setCurrencyRateRUR(25.5f);
		ri.setDeleted(false);
		ri.setEmplBranchId(null);
		ri.setEmplCompany("Pepsi");
		ri.setEmplOrderId(null);
		ri.setEmplPositionId(null);
		ri.setEmplStartDate(null);
		ri.setEmplTitle("Sales Rep");
		ri.setFileId(null);
		ri.setHomeCity("homeCity");
		ri.setItemID(itemID);
		ri.setLanguages("Languages");
		ri.setPlus(true);
		ri.setRegionId(1);
		ri.setRegionName("regionName");
		ri.setStatus(null);
		ri.setUpdated(new Date());
		ri.setUpdaterId(1);
		ri.setUpdaterName("updaterName");
		ri.setUserLabels("userLabels");
		ri.setViewed(new Date());

		return ri;
	}

	public ItemObjectCandidate loadItemView(int queryID, int offset) {
		ItemObjectCandidate i = new ItemObjectCandidate();
		
		ArrayList<Integer> results = cacheResults.get(queryID);
		
		if (results != null) {
			Integer itemId = results.get(offset);
			i.setID(itemId);
			
			if (new Random().nextInt(10) > 5) {
				i.setItemView(itemId + "<br/>Петров Геннадий Анатольевич<br/>    Возраст: 40<br/>    Город: Украина, Голая Пристань<br/>    Образование: высшее<br/>    Профессиональные навыки:<br/>    Составлял рецептуру колбас по ГОСТу.<br/><br/> <br/>Вид просмотра: расширенный краткий<br/>Резюме соискателя<br/><br/>Технолог мясной промышленности<br/>21.02.09, Украина, Херсон, оклад $1000<br/><br/>Образование:<br/>1988-1994 Украинский государственный университет пищевых технологий<br/>Специальность: технология мяса и мясных продуктов<br/>Присвоена квалификация: инженер-технолог<br/>Профессиональный опыт:<br/>1986 -1987 Симферопольский мясокомбинат, фаршесоставитель 4 разряд .<br/>1987 - 1990 Голопристанский РПС, фаршесоставитель 5 разряд<br/>1990 - 1993 Херсонский Горкоопторг, фаршесоставитель<br/>1993 - Мастер колбасного цеха<br/>2004 - 2005 Технолог колбасного цеха (Россия, г. Осташково )<br/>Знания и навыки :<br/>Организация работы мясного цеха; оформление заказов на мясное сырье; ведение документации по закупке/расходу сырья; технологическое оборудование. Расчет рецептур; составление технологических инструкций; учет сырья и вспомогательных материалов; составление бухгалтерского отчета по движению сырья и вспомогательных материалов; обучение персонала. Организация работы предприятия «с нуля».<br/><br/>Другие навыки:<br/>Продвинутый пользователь ПК:<br/>MS Office (MS Word, MS Excel, MS PowerPoint, MS Access).<br/>Графические редакторы (Adobe Photoshop, Adobe Illustrator, CorelDraw).<br/>Интернет (Opera, Outlook Express, The Bat, Internet Explorer).<br/>Водительские права категории «А», «B», «С», наличие автомобиля.<br/><br/>Личностные данные:<br/>Поиск решений вместо заострения проблемы. Предпочтение коллективной и командной организации работы, эффективное и рациональное распределение полномочий, четкое следование собственным обязанностям, ответственность, способность к обучению и адаптации к новым условиям, способность работать в высоком темпе, коммуникабельность и исполнительность.<br/>Мой адрес:<br/>75600<br/>Херсонская обл.<br/>г. Голая Пристань<br/>ул. К. Маркса 94, кв.21<br/>моб. (8-050) 98-575-98");			
			} else {
				i.setItemView(itemId + "<br/>Козлов Витаилй<br>Должность: Менеджер<br>Желаемая зарплата: от 0 рублей<br>Город: Москва, Ст. метро: Тушинская.<br>Готов переехать: Москва<br>Отрасль: Розничное кредитование<br>	<br>Контактный телефон: 7 916 7066171<br>Опыт работы: 3-5 лет<br>Образование: среднее-специальное<br>Дата рождения : 1983-07-24<br>Пол: мужской<br>Знание языков:<br>не указано<br>Наличие автомобиля : отсутствует<br>Водительские права : отсутствуют<br>О себе:<br><br>Козлов Виталий Анатольевич E - Mail : Kozlov _ V . A @ mail . ru контактный тел. +7(916)706-61-71<br><br>Сведения о себе<br><br>Козлов Виталий Анатольевич E - Mail : Kozlov _ V . A @ mail . ru контактный тел. +7(916)706-61-71 Сведения о себе<br>Год рождения 24.07.1983<br>Место рождения РФ, республика Мордовия, г. Краснослободск<br>Национальность Русский<br>Семейное положение Не женат, детей нет<br>Личные качества Стрессоустойчив, коммуникабельный, легкообучаемый, внимательный<br>Навыки ПК – уверенный пользователь , MS Office, MS Word, Outlook, Internet, Corel Draw, PhotoShop, Орг . техника , факс . Английский базовый Сведения об образовании<br>Наименование учреждения Специальность Годы учебы (начало-окончание)<br>Краснослободский Зооветеринарный Техникум Зоотехник (очное) 01.09.1998 - 25.06.2002<br>Краснослободское профессиональное училище№18 Токарь (очное) 27.01.2003 – 09.04.2003<br>Краснослободское профессиональное училище №28 Электро-газосварщик 3 разряда 01.09.2003 – 23.06.2004 Сведения о работе<br>Начало - окончание работы Место работы Специальность, обязанности<br>27.07.2004 – 14.02.2005 ОАО «Краснослободская Прядильно-Ткацкая фабрика» Электросварщик, дуговая электросварка во всех пространственных положениях, сварка отопительной системы.<br>11.03.2005-06.07.2007 ЗАО «Инвестэлектро-связь» Электромонтажник Электро-газосварка башенного оборудования, отопительной системы, сборка, монтаж и установка радио вышек, сварка отопления, электропроводка внутри помещений, сборка, монтаж и пуско-наладка вентиляционного оборудования, работы на токарном станке, строительство помещений производственного типа.<br>19.07.2007- 14.08.2008 ООО «Хоум Кредит энд Финанс банк» Администратор отдела продаж кредитных продуктов, активное привлечение клиентов, презентация и продажа банковских продуктов, предоставление информации по банковским продуктам, проверка документации заемщика, оформление Кредитных договоров, активация кредитных карт, ведение банковской документации.<br><br>Сведения об образовании<br><br>Козлов Виталий Анатольевич E - Mail : Kozlov _ V . A @ mail . ru контактный тел. +7(916)706-61-71 Сведения о себе<br>Год рождения 24.07.1983<br>Место рождения РФ, республика Мордовия, г. Краснослободск<br>Национальность Русский<br>Семейное положение Не женат, детей нет<br>Личные качества Стрессоустойчив, коммуникабельный, легкообучаемый, внимательный<br>Навыки ПК – уверенный пользователь , MS Office, MS Word, Outlook, Internet, Corel Draw, PhotoShop, Орг . техника , факс . Английский базовый Сведения об образовании<br>Наименование учреждения Специальность Годы учебы (начало-окончание)<br>Краснослободский Зооветеринарный Техникум Зоотехник (очное) 01.09.1998 - 25.06.2002<br>Краснослободское профессиональное училище№18 Токарь (очное) 27.01.2003 – 09.04.2003<br>Краснослободское профессиональное училище №28 Электро-газосварщик 3 разряда 01.09.2003 – 23.06.2004 Сведения о работе<br>Начало - окончание работы Место работы Специальность, обязанности<br>27.07.2004 – 14.02.2005 ОАО «Краснослободская Прядильно-Ткацкая фабрика» Электросварщик, дуговая электросварка во всех пространственных положениях, сварка отопительной системы.<br>11.03.2005-06.07.2007 ЗАО «Инвестэлектро-связь» Электромонтажник Электро-газосварка башенного оборудования, отопительной системы, сборка, монтаж и установка радио вышек, сварка отопления, электропроводка внутри помещений, сборка, монтаж и пуско-наладка вентиляционного оборудования, работы на токарном станке, строительство помещений производственного типа.<br>19.07.2007- 14.08.2008 ООО «Хоум Кредит энд Финанс банк» Администратор отдела продаж кредитных продуктов, активное привлечение клиентов, презентация и продажа банковских продуктов, предоставление информации по банковским продуктам, проверка документации заемщика, оформление Кредитных договоров, активация кредитных карт, ведение банковской документации.<br><br>Сведения о работе<br><br>Козлов Виталий Анатольевич E - Mail : Kozlov _ V . A @ mail . ru контактный тел. +7(916)706-61-71 Сведения о себе<br>Год рождения 24.07.1983<br>Место рождения РФ, республика Мордовия, г. Краснослободск<br>Национальность Русский<br>Семейное положение Не женат, детей нет<br>Личные качества Стрессоустойчив, коммуникабельный, легкообучаемый, внимательный<br>Навыки ПК – уверенный пользователь , MS Office, MS Word, Outlook, Internet, Corel Draw, PhotoShop, Орг . техника , факс . Английский базовый Сведения об образовании<br>Наименование учреждения Специальность Годы учебы (начало-окончание)<br>Краснослободский Зооветеринарный Техникум Зоотехник (очное) 01.09.1998 - 25.06.2002<br>Краснослободское профессиональное училище№18 Токарь (очное) 27.01.2003 – 09.04.2003<br>Краснослободское профессиональное училище №28 Электро-газосварщик 3 разряда 01.09.2003 – 23.06.2004 Сведения о работе<br>Начало - окончание работы Место работы Специальность, обязанности<br>27.07.2004 – 14.02.2005 ОАО «Краснослободская Прядильно-Ткацкая фабрика» Электросварщик, дуговая электросварка во всех пространственных положениях, сварка отопительной системы.<br>11.03.2005-06.07.2007 ЗАО «Инвестэлектро-связь» Электромонтажник Электро-газосварка башенного оборудования, отопительной системы, сборка, монтаж и установка радио вышек, сварка отопления, электропроводка внутри помещений, сборка, монтаж и пуско-наладка вентиляционного оборудования, работы на токарном станке, строительство помещений производственного типа.<br>19.07.2007- 14.08.2008 ООО «Хоум Кредит энд Финанс банк» Администратор отдела продаж кредитных продуктов, активное привлечение клиентов, презентация и продажа банковских продуктов, предоставление информации по банковским продуктам, проверка документации заемщика, оформление Кредитных договоров, активация кредитных карт, ведение банковской документации. ");			
			}
		}
		
		return i;
	}

//	public ItemObjectCandidate loadItemView(int queryID, int offset) throws Exception {
//		ItemObjectCandidate result = new ItemObjectCandidate();
//		
//		ArrayList<Integer> results = cacheResults.get(queryID);
//		
//		if (results == null) {
//			return result;
//		}
//		
//		Integer itemId = results.get(offset);
//		result.setID(itemId);
//		
//		Context initCtx = new InitialContext();
//		Context envCtx = (Context) initCtx.lookup("java:comp/env");
//		DataSource ds = (DataSource)
//		envCtx.lookup("jdbc/mainDB");
//
//		Connection conn = ds.getConnection();
//
//		try {
//			Statement stmt = conn.createStatement();
//			try {
//				ResultSet rs = stmt.executeQuery("SELECT resume_text"
//						+ " FROM candidates WHERE id = " + itemId);
//				try {
//					if (rs.next()) {
//						result.setItemView(rs.getString("resume_text"));
//					}
//				} finally {
//					cleanUp(rs);
//				}
//			} finally {
//				cleanUp(stmt);
//			}
//		} finally {
//			cleanUp(conn);
//		}
//		
//		return result;
//	}
	
}
